// 映射菜单模块
import type { IBreadcrumb } from '@/base-ui/breadcrumb/types'
import type { RouteRecordRaw } from 'vue-router'

let firstMenu: any = null

export function mapMenusToRoutes(userMenus: any[]) {
  const routes: RouteRecordRaw[] = []
  // 1.先加载所有默认的 routes
  const allRoutes: any[] = []
  /*
    import.meta.glob 动态获取一个目录下的文件 vite特有的
    官方文档：https://cn.vitejs.dev/guide/features.html#glob-import
    webpack用这个： require.context
  */
  const routeFiles: any = import.meta.glob('../router/main/**/*.ts', {
    eager: true
  })
  /*
    for (const path in routeFiles) {
      // 异步代码导致数据还没获取到
      routeFiles[path]().then((module: any) => {
        console.log('path和mod', path, module)
        // 需要的信息都在default里面
        allRoutes.push(module.default)
        console.log('allRoutes', allRoutes)
      })
    } */
  // console.log(routeFiles)

  // 这种遍历方式不是异步的
  Object.keys(routeFiles).forEach((val) => {
    const route = routeFiles[val]
    allRoutes.push(route.default)
  })

  // 2、根据菜单获取需要添加的routes （递归获取）
  /*
    这个方法可以递归获取到传入的数组对象里面的属性，并且遍历他们，最终找到上面定义好的数组里面的路由对象
    然后再加入到 store 里面的用户菜单列表
    但是这里出了点问题，不知道怎么解决
    const route = allRoutes.find((item) => item.path === menu.url)
    这行代码返回了 undefined 不知道是为什么，如果以后遇到这个问题知道怎么解决了，再过来看看吧
    出大问题了 2022.9.16晚上
    2022.9.17 似乎解决了一部分了
    2022.9.18 解决了
  */
  const _recurseGetRoute = (menus: any[]) => {
    for (const menu of menus) {
      // 等于2的才是点击以后要映射对应路由组件的菜单项
      if (menu.type === 2) {
        // 找到匹配成功的路由
        const route = allRoutes.find((item) => item.path === menu.url)
        if (route) routes.push(route)
        // 只会找一次 初始默认选中的那个
        if (!firstMenu) {
          firstMenu = menu
        }
      } else {
        _recurseGetRoute(menu.children)
      }
    }
  }
  _recurseGetRoute(userMenus)

  return routes
}

// 面包屑
export function pathMapBreadcrumbs(userMenus: any[], currentPath: string) {
  const breadcrumbs: IBreadcrumb[] = []
  pathMapToMenu(userMenus, currentPath, breadcrumbs)
  return breadcrumbs
}
/*
    // 面包屑 原来的写法
  export function pathMapBreadcrumbs(userMenus: any[], currentPath: string) {
    const breadcrumbs: IBreadcrumb[] = []
    for (const menu of userMenus) {
      if (menu.type === 1) {
        // 这里已经接收到了下面else if 返回找到的menu 第二次调用
        const findMenu = pathMapToMenu(menu.children ?? [], currentPath)
        if (findMenu) {
          breadcrumbs.push({ name: menu.name, path: menu.url })
          breadcrumbs.push({ name: findMenu.name, path: findMenu.url })
          return findMenu
        }
      } else if (menu.type === 2 && menu.url === currentPath) {
        return menu
      }
    }
    return breadcrumbs
  }
*/
// 查找 选中的 菜单项
// 2函数合并 因为有重复逻辑代码
export function pathMapToMenu(
  userMenus: any[],
  currentPath: string,
  breadcrumbs?: IBreadcrumb[]
): any {
  for (const menu of userMenus) {
    if (menu.type === 1) {
      // 这里已经接收到了下面else if 返回找到的menu 第二次调用
      const findMenu = pathMapToMenu(menu.children ?? [], currentPath)
      if (findMenu) {
        breadcrumbs?.push({ name: menu.name })
        breadcrumbs?.push({ name: findMenu.name })
        return findMenu
      }
    } else if (menu.type === 2 && menu.url === currentPath) {
      // 如果菜单类型等于2的话 就说明找到 直接返回
      return menu
    }
  }
}

// 查找权限菜单 递归
export function mapMenusToPermissions(userMenus: any[]) {
  const permissions: string[] = []

  const _recurseGetPermission = (menus: any[]) => {
    for (const menu of menus) {
      // 如果type=1或2 都不是想要的带权限属性的数据 只有type=3才是 继续遍历
      if (menu.type === 1 || menu.type === 2) {
        _recurseGetPermission(menu.children ?? [])
      } else if (menu.type === 3) {
        permissions.push(menu.permission)
      }
    }
  }
  _recurseGetPermission(userMenus)

  return permissions
}

// 递归遍历叶子节点的 role.vue
export function menuMapLeafKeys(menuList: any[]) {
  const leafKeys: number[] = []

  const _recurseGetLeaf = (menuList: any[]) => {
    for (const item of menuList) {
      // 如果存在children 就再次调用函数
      if (item.children) {
        _recurseGetLeaf(item.children)
        // 否则为找到，添加进数组
      } else {
        leafKeys.push(item.id)
      }
    }
  }
  _recurseGetLeaf(menuList)

  return leafKeys
}
export { firstMenu }
